CONTENTS | INDEX | PREV | NEXT
 FUNCTION
 DICE Linker

 SYNOPSIS
 dlink options files libraries

 DESCRIPTION
 The final step in creating an Amiga program is linking.  Normally the
 linker is invoked as needed by dcc or VMake.

 Options may occur anywhere on the command lines.  Any file ending in
 .o or .obj is assumed to be an object file.  Any file ending in .l or
 .lib is assumed to be a library.  Any file name beginning with @@
 specifies a text file containing a further list of files.

 File ordering is maintained.  Section ordering is maintained.  All
 sections of the same name are coagulated together with ordering
 maintained.

 || NOTE: Inter-section ordering is not maintained within a library
 || since library modules are random included.  However, ordering is
 || maintained *between* libraries.

 All object files specified are included in the final executable.  All
 libraries specified are searched at the point they are specified
 (that is, specifying an object file that references a symbol defined
 in a library specified BEFORE the object file will cause an undefined
 symbol error).  Normally an object file is specified after a library
 to terminate an autoinit or autoexit section.

 You do not have to order object files within a library, DLink will
 automatically make as many passes as required to handle all internal
 library references.  However, ordering object files will make DLink
 go faster.

 Symbols defined in object files override symbols defined in
 libraries. Symbols defined in libraries specified before later
 libraries override symbols defined in later libraries.  Symbols
 defined in a library and also defined in a later specified object
 module causes an error. -o execname name of executable

 -s  Include symbolic information.

     || NOTE: if -r is used symbolic info for the data sections will
     || point to the statically init'd stuff, NOT The actual data
     || space (in BSS) referenced by the code.  This is a bug.

  -frag  Fragment output file (default is to coagulate all hunks of the
     same type regardless of name).  If frag is specified then only
     hunks of the same type AND name are coagulated.

     see fragmentation note at bottom

 -r[es]  Resident link.

    -pi  Position independent non-residentable (i.e.  only one copy of the
     data but also no relocation hunks)

     -pr residentable position independent

 -Ppostfix  specify library name postfix.  If DLink cannot find the library
       as specified it will append the postfix and try again.  Used by
     DCC to specify the memory model.

 -mw addr  specify absolute data base

 -ma addr  specify absolute data base

     Both options do exactly the same thing and are in duplicate to
     conform to DCC's options.

 -mw
 -ma   specify the base of data as a decimal, 0octal, or 0xHEX address.
     You must use the -r option in conjunction with these options.

     DLink will resolve all Absolute-Word addresses but not all
     Absolute-Long addresses.  This is left up to the ROMABLE program
     which generates a raw binary image of the program that can then
     be transferred to an EPROM.

     || NOTE: Do not use this option when generating Amiga
     || executables.

  -d[#]  debug mode (spews lots of debugging junk out)

  -E file  specify stderr file, any errors are appended to the file instead
      of to stdout.  Useful for batch compiles

  -chip  chip-only - forces all hunks into CHIP memory

    -L0  remove default library search path, including all explicitly
     specified (-L dir) directories up to this point.

  -L dir  add the specified directory to the library search path.  If the
     object module or library can not be found in the current
     directory, directories specified with -L are searched.  -L
     directories are searched before the default library directory
     (DLIB:), assuming it was not removed with -L0 .

     Note that the directory path specified by -L is used to search
     for libraries AND object modules.

     A trailing '/' is optional

   -Ppostfix  This allows you to specify -lc -Ps and DLink will automatically
     look for cs.lib ...  you can specify a postfix that occurs before
     the .lib in the library name here.  If DLink cannot find the
     library as it is named by default it will try it with the
     postfix.

     DCC uses this to supply the memory model to DLINK also allowing
     the user to say -lm in DCC and have it find MS.LIB if you are
     using the small-data model.

 CREATING A LIBRARY
 DLink libraries are standard Amiga libraries...  simply join one or
 more object modules together and rename the result with a .lib
 extension.

 LINKER SYMBOLS
 DLink generates the following special symbols to aid in program
 startup:

 Symbol         : Meaning
 ===============+=====================================================
 __ABSOLUTE_BAS : Base of data in volatile space.  This symbol is NOT
            : defined for normal residentable programs since the
            : base address is not known (must be allocated
            : run-time)
 ---------------+-----------------------------------------------------
 __DATA_BAS     : Base of data in non-volatile space.  This symbol
            : points to a read-only copy of the initialized data
            : for a program.  For Non-residentable programs this
            : is the same as __ABSOLUTE_BAS. For residentable
            : programs this points to a read-only copy of the
            : initialized data that the program can duplicate on
            : startup. For programs linked with an absolute base
            : address for data this points to the end of the CODE
            : section.  The ROMABLE program always generates a
            : ROM copy of the initialized data just after the
            : CODE section (which startup code must copy into
            : RAM)
 ---------------+-----------------------------------------------------
 __DATA_LEN     : Length of data space is longwords.  i.e.
            : __DATA_LEN*4 yields the number of bytes of
            : initialized data.  This is used by startup code to
            : copy read-only initialized data to volatile space
            : (residentable and data-absolute programs)
 ---------------+-----------------------------------------------------
 __BSS_LEN      : Length of bss space in longwords.  i.e.
            : __BSS_LEN*4 yields the number of bytes of
            : uninitialized (BSS) data.  This is used in
            : combination with __DATA_LEN to allocate the
            : DATA+BSS space for residentable programs, and clear
            : the BSS space for non-residentable and
            : absolute-data-base programs.  The BSS space occurs
            : after the DATA space unless the -frag option is
            : used.
 ---------------+-----------------------------------------------------
 __RESIDENT5D   : This symbol is set to 0 if the -r option was used
            : and 1 if the -r option was not used.  If set to 1
            : (-r option)
 ---------------+-----------------------------------------------------

 Programs linked with the -mw or -ma options obviously do not
 'allocate' their data space since it is predefined.  Most Amiga
 programmers will never use the -mw or -ma options, by the way.

 SMALL DATA MODEL
 The small data model uses A4 relative addressing.  The linker sets up
 all relative offsets such that A4 must be initialized by startup code
 the BaseOfInitializedData + 32766 for A4-relative references to
 access the appropriate address.
   
 RESIDENT
 If the -r options is given then NO BSS SPACE is allocated after the
 data space...  the startup code MUST allocate a data+bss space as
 shown above.  DLink will give error messages for any absolute data
 references that occur (except the __DATA_BAS symbol which must be
 used to copy the static data to the newly allocated data+bss memory
 on program startup).
   
 DLink will give an error message if any data-data reloco32s exist
 when you specify the -r option as such relocations would be incorrect
 when copied to the newly allocated data+bss space.  DC1 understands
 this and will produce autoinit code to handle any such static data
 relocations that occur in your C code when the -r option is given to
 compile a C program.
   
 However, DLink does allow data-data relocations to occur if an
 absolute data base is specified along with the -r option.  This is
 used only when making ROMABLE code.
   
 PC-RELATIVE
 Because the linker will insert a jump table for PC-RELATIVE
 references to different hunks (after coagulation) or where the range
 is larger than +/-32K, data should not be placed into a code segment
 and be referenced via an external label(pc) unless you are positive
 the reference is within +/-32K.  This can only happen when
 referencing between like-named code hunks.  NOTE that the jump table
 is tagged onto the end of the section the jump(s) occur in and thus
 you do not want to have any autoinit/autoexit code that might
 possibly generate a jump table (since the whole idea with autoinit is
 that the code falls through to other autoinit code until the
 terminating section in x.o's RTS).
   
 Currently dlink cannot handle inter-module PC-RELATIVE references
 beyond +/-32K (i.e.  when one object file has more than 32K of code).
 An error will occur.
   
 Note that if -frag is used you cannot make PC-RELATIVE calls between
 sections of differing names ever, or make a program resident.  The
 -frag option is almost never used on untested.
   
 || NOTE: When -frag is specified, the linker will not create a
 || special combined data+bss hunk (so data and bss can both be
 || referenced with one base variable).
   
 However, when -frag is NOT specified, the linker will stil not
 necessarily combine ALL data hunks into one big hunk and ALL bss
 hunks into one big hunk.  Any data or bss hunk with special upper
 bits set (e.g. to force it into chip) is not combined into these
 special hunks, and any data or bss hunk whos NAME begins with 'far'
 (upper or lower case) will also not be considered.
   
 EXAMPLE
 This is what DCC gives the linker to link the program foo.c:
   
 dlink dlib:c.o @tmp dlib:x.o -o ram:foo
   
 Where tmp contains:
   
 foo.o
 dlib:c.lib
 dlib:amiga.lib
 dlib:auto.lib
   
 Basically it tells dlink to link the startup code, c.o, then the
 program object module(s) (foo.o), then c.lib, amiga.lib, and
 auto.lib, then finally x.o.
   
 DCC handles all this for you
   
 auto.lib contains autoinit code for certain selected libraries,
 including the dos.library.  Autoinit code is brought in whenever a
 given library base symbol has been referenced BUT NOT DEFINED.
 auto.lib defines the symbol and generates autoinit code to open the
 library and autoexit code to close the library.  To maintain
 portability you probably do not want to use this automatic
 library-opening feature yourself, it is really meant to support
 certain actions of the DICE library (such as floating point support).
   
 x.o terminates the autoinit and autoexit sections with an RTS
 instruction.  The autoinit and autoexit sections are called from the
 startup code c.o.